#include "lagrangetriangle.h"


std::vector<double> lagrangetriangle::getnodecoordinates(int order)
{
     switch (order)
     {
          case 1:
               return std::vector<double> {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0};
          case 2:
               return std::vector<double> {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.5, 0.0};
          case 3:
               return std::vector<double> {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.33333333333333333333, 0.0, 0.0, 0.66666666666666666667, 0.0, 0.0, 0.66666666666666666667, 0.33333333333333333333, 0.0, 0.33333333333333333333, 0.66666666666666666667, 0.0, 0.0, 0.66666666666666666667, 0.0, 0.0, 0.33333333333333333333, 0.0, 0.33333333333333333333, 0.33333333333333333333, 0.0};
          case 4:
               return std::vector<double> {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.25, 0.0, 0.0, 0.5, 0.0, 0.0, 0.75, 0.0, 0.0, 0.75, 0.25, 0.0, 0.5, 0.5, 0.0, 0.25, 0.75, 0.0, 0.0, 0.75, 0.0, 0.0, 0.5, 0.0, 0.0, 0.25, 0.0, 0.25, 0.25, 0.0, 0.5, 0.25, 0.0, 0.25, 0.5, 0.0};
          case 5:
               return std::vector<double> {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.2, 0.0, 0.0, 0.4, 0.0, 0.0, 0.6, 0.0, 0.0, 0.8, 0.0, 0.0, 0.8, 0.2, 0.0, 0.6, 0.4, 0.0, 0.4, 0.6, 0.0, 0.2, 0.8, 0.0, 0.0, 0.8, 0.0, 0.0, 0.6, 0.0, 0.0, 0.4, 0.0, 0.0, 0.2, 0.0, 0.2, 0.2, 0.0, 0.6, 0.2, 0.0, 0.2, 0.6, 0.0, 0.4, 0.2, 0.0, 0.4, 0.4, 0.0, 0.2, 0.4, 0.0};
          case 6:
               return std::vector<double> {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.16666666666666666667, 0.0, 0.0, 0.33333333333333333333, 0.0, 0.0, 0.5, 0.0, 0.0, 0.66666666666666666667, 0.0, 0.0, 0.83333333333333333333, 0.0, 0.0, 0.83333333333333333333, 0.16666666666666666667, 0.0, 0.66666666666666666667, 0.33333333333333333333, 0.0, 0.5, 0.5, 0.0, 0.33333333333333333333, 0.66666666666666666667, 0.0, 0.16666666666666666667, 0.83333333333333333333, 0.0, 0.0, 0.83333333333333333333, 0.0, 0.0, 0.66666666666666666667, 0.0, 0.0, 0.5, 0.0, 0.0, 0.33333333333333333333, 0.0, 0.0, 0.16666666666666666667, 0.0, 0.16666666666666666667, 0.16666666666666666667, 0.0, 0.66666666666666666667, 0.16666666666666666667, 0.0, 0.16666666666666666667, 0.66666666666666666667, 0.0, 0.33333333333333333333, 0.16666666666666666667, 0.0, 0.5, 0.16666666666666666667, 0.0, 0.5, 0.33333333333333333333, 0.0, 0.33333333333333333333, 0.5, 0.0, 0.16666666666666666667, 0.5, 0.0, 0.16666666666666666667, 0.33333333333333333333, 0.0, 0.33333333333333333333, 0.33333333333333333333, 0.0};
          case 7:
               return std::vector<double> {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.14285714285714285714, 0.0, 0.0, 0.28571428571428571429, 0.0, 0.0, 0.42857142857142857143, 0.0, 0.0, 0.57142857142857142857, 0.0, 0.0, 0.71428571428571428571, 0.0, 0.0, 0.85714285714285714286, 0.0, 0.0, 0.85714285714285714286, 0.14285714285714285714, 0.0, 0.71428571428571428571, 0.28571428571428571429, 0.0, 0.57142857142857142857, 0.42857142857142857143, 0.0, 0.42857142857142857143, 0.57142857142857142857, 0.0, 0.28571428571428571429, 0.71428571428571428571, 0.0, 0.14285714285714285714, 0.85714285714285714286, 0.0, 0.0, 0.85714285714285714286, 0.0, 0.0, 0.71428571428571428571, 0.0, 0.0, 0.57142857142857142857, 0.0, 0.0, 0.42857142857142857143, 0.0, 0.0, 0.28571428571428571429, 0.0, 0.0, 0.14285714285714285714, 0.0, 0.14285714285714285714, 0.14285714285714285714, 0.0, 0.71428571428571428571, 0.14285714285714285714, 0.0, 0.14285714285714285714, 0.71428571428571428571, 0.0, 0.28571428571428571429, 0.14285714285714285714, 0.0, 0.42857142857142857143, 0.14285714285714285714, 0.0, 0.57142857142857142857, 0.14285714285714285714, 0.0, 0.57142857142857142857, 0.28571428571428571429, 0.0, 0.42857142857142857143, 0.42857142857142857143, 0.0, 0.28571428571428571429, 0.57142857142857142857, 0.0, 0.14285714285714285714, 0.57142857142857142857, 0.0, 0.14285714285714285714, 0.42857142857142857143, 0.0, 0.14285714285714285714, 0.28571428571428571429, 0.0, 0.28571428571428571429, 0.28571428571428571429, 0.0, 0.42857142857142857143, 0.28571428571428571429, 0.0, 0.28571428571428571429, 0.42857142857142857143, 0.0};
          case 8:
               return std::vector<double> {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.125, 0.0, 0.0, 0.25, 0.0, 0.0, 0.375, 0.0, 0.0, 0.5, 0.0, 0.0, 0.625, 0.0, 0.0, 0.75, 0.0, 0.0, 0.875, 0.0, 0.0, 0.875, 0.125, 0.0, 0.75, 0.25, 0.0, 0.625, 0.375, 0.0, 0.5, 0.5, 0.0, 0.375, 0.625, 0.0, 0.25, 0.75, 0.0, 0.125, 0.875, 0.0, 0.0, 0.875, 0.0, 0.0, 0.75, 0.0, 0.0, 0.625, 0.0, 0.0, 0.5, 0.0, 0.0, 0.375, 0.0, 0.0, 0.25, 0.0, 0.0, 0.125, 0.0, 0.125, 0.125, 0.0, 0.75, 0.125, 0.0, 0.125, 0.75, 0.0, 0.25, 0.125, 0.0, 0.375, 0.125, 0.0, 0.5, 0.125, 0.0, 0.625, 0.125, 0.0, 0.625, 0.25, 0.0, 0.5, 0.375, 0.0, 0.375, 0.5, 0.0, 0.25, 0.625, 0.0, 0.125, 0.625, 0.0, 0.125, 0.5, 0.0, 0.125, 0.375, 0.0, 0.125, 0.25, 0.0, 0.25, 0.25, 0.0, 0.5, 0.25, 0.0, 0.25, 0.5, 0.0, 0.375, 0.25, 0.0, 0.375, 0.375, 0.0, 0.25, 0.375, 0.0};
          case 9:
               return std::vector<double> {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.11111111111111111111, 0.0, 0.0, 0.22222222222222222222, 0.0, 0.0, 0.33333333333333333333, 0.0, 0.0, 0.44444444444444444444, 0.0, 0.0, 0.55555555555555555556, 0.0, 0.0, 0.66666666666666666667, 0.0, 0.0, 0.77777777777777777778, 0.0, 0.0, 0.88888888888888888889, 0.0, 0.0, 0.88888888888888888889, 0.11111111111111111111, 0.0, 0.77777777777777777778, 0.22222222222222222222, 0.0, 0.66666666666666666667, 0.33333333333333333333, 0.0, 0.55555555555555555556, 0.44444444444444444444, 0.0, 0.44444444444444444444, 0.55555555555555555556, 0.0, 0.33333333333333333333, 0.66666666666666666667, 0.0, 0.22222222222222222222, 0.77777777777777777778, 0.0, 0.11111111111111111111, 0.88888888888888888889, 0.0, 0.0, 0.88888888888888888889, 0.0, 0.0, 0.77777777777777777778, 0.0, 0.0, 0.66666666666666666667, 0.0, 0.0, 0.55555555555555555556, 0.0, 0.0, 0.44444444444444444444, 0.0, 0.0, 0.33333333333333333333, 0.0, 0.0, 0.22222222222222222222, 0.0, 0.0, 0.11111111111111111111, 0.0, 0.11111111111111111111, 0.11111111111111111111, 0.0, 0.77777777777777777778, 0.11111111111111111111, 0.0, 0.11111111111111111111, 0.77777777777777777778, 0.0, 0.22222222222222222222, 0.11111111111111111111, 0.0, 0.33333333333333333333, 0.11111111111111111111, 0.0, 0.44444444444444444444, 0.11111111111111111111, 0.0, 0.55555555555555555556, 0.11111111111111111111, 0.0, 0.66666666666666666667, 0.11111111111111111111, 0.0, 0.66666666666666666667, 0.22222222222222222222, 0.0, 0.55555555555555555556, 0.33333333333333333333, 0.0, 0.44444444444444444444, 0.44444444444444444444, 0.0, 0.33333333333333333333, 0.55555555555555555556, 0.0, 0.22222222222222222222, 0.66666666666666666667, 0.0, 0.11111111111111111111, 0.66666666666666666667, 0.0, 0.11111111111111111111, 0.55555555555555555556, 0.0, 0.11111111111111111111, 0.44444444444444444444, 0.0, 0.11111111111111111111, 0.33333333333333333333, 0.0, 0.11111111111111111111, 0.22222222222222222222, 0.0, 0.22222222222222222222, 0.22222222222222222222, 0.0, 0.55555555555555555556, 0.22222222222222222222, 0.0, 0.22222222222222222222, 0.55555555555555555556, 0.0, 0.33333333333333333333, 0.22222222222222222222, 0.0, 0.44444444444444444444, 0.22222222222222222222, 0.0, 0.44444444444444444444, 0.33333333333333333333, 0.0, 0.33333333333333333333, 0.44444444444444444444, 0.0, 0.22222222222222222222, 0.44444444444444444444, 0.0, 0.22222222222222222222, 0.33333333333333333333, 0.0, 0.33333333333333333333, 0.33333333333333333333, 0.0};
          case 10:
               return std::vector<double> {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.1, 0.0, 0.0, 0.2, 0.0, 0.0, 0.3, 0.0, 0.0, 0.4, 0.0, 0.0, 0.5, 0.0, 0.0, 0.6, 0.0, 0.0, 0.7, 0.0, 0.0, 0.8, 0.0, 0.0, 0.9, 0.0, 0.0, 0.9, 0.1, 0.0, 0.8, 0.2, 0.0, 0.7, 0.3, 0.0, 0.6, 0.4, 0.0, 0.5, 0.5, 0.0, 0.4, 0.6, 0.0, 0.3, 0.7, 0.0, 0.2, 0.8, 0.0, 0.1, 0.9, 0.0, 0.0, 0.9, 0.0, 0.0, 0.8, 0.0, 0.0, 0.7, 0.0, 0.0, 0.6, 0.0, 0.0, 0.5, 0.0, 0.0, 0.4, 0.0, 0.0, 0.3, 0.0, 0.0, 0.2, 0.0, 0.0, 0.1, 0.0, 0.1, 0.1, 0.0, 0.8, 0.1, 0.0, 0.1, 0.8, 0.0, 0.2, 0.1, 0.0, 0.3, 0.1, 0.0, 0.4, 0.1, 0.0, 0.5, 0.1, 0.0, 0.6, 0.1, 0.0, 0.7, 0.1, 0.0, 0.7, 0.2, 0.0, 0.6, 0.3, 0.0, 0.5, 0.4, 0.0, 0.4, 0.5, 0.0, 0.3, 0.6, 0.0, 0.2, 0.7, 0.0, 0.1, 0.7, 0.0, 0.1, 0.6, 0.0, 0.1, 0.5, 0.0, 0.1, 0.4, 0.0, 0.1, 0.3, 0.0, 0.1, 0.2, 0.0, 0.2, 0.2, 0.0, 0.6, 0.2, 0.0, 0.2, 0.6, 0.0, 0.3, 0.2, 0.0, 0.4, 0.2, 0.0, 0.5, 0.2, 0.0, 0.5, 0.3, 0.0, 0.4, 0.4, 0.0, 0.3, 0.5, 0.0, 0.2, 0.5, 0.0, 0.2, 0.4, 0.0, 0.2, 0.3, 0.0, 0.3, 0.3, 0.0, 0.4, 0.3, 0.0, 0.3, 0.4, 0.0};
          default:
               std::cout << "Error in 'lagrangetriangle' namespace: coordinates of order 11 and above not defined" << std::endl;
               abort();
               break;
     }
}

std::vector<polynomial> lagrangetriangle::getformfunctionpolynomials(int order)
{
     element triangle(2,order);
     std::vector<polynomial> formfunctionpoly(triangle.countcurvednodes());

     switch (order)
     {
          case 1:
               formfunctionpoly[0].set({{{1.0}, {-1.0}}, {{-1.0}}});
               formfunctionpoly[1].set({{{0.0}, {0.0}}, {{1.0}}});
               formfunctionpoly[2].set({{{0.0}, {1.0}}, {{0.0}}});
               break;
          case 2:
               formfunctionpoly[0].set({{{1.0}, {-3.0}, {2.0}}, {{-3.0}, {4.0}}, {{2.0}}});
               formfunctionpoly[1].set({{{0.0}, {0.0}, {0.0}}, {{-1.0}, {0.0}}, {{2.0}}});
               formfunctionpoly[2].set({{{0.0}, {-1.0}, {2.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[3].set({{{0.0}, {0.0}, {0.0}}, {{4.0}, {-4.0}}, {{-4.0}}});
               formfunctionpoly[4].set({{{0.0}, {0.0}, {0.0}}, {{0.0}, {4.0}}, {{0.0}}});
               formfunctionpoly[5].set({{{0.0}, {4.0}, {-4.0}}, {{0.0}, {-4.0}}, {{0.0}}});
               break;
          case 3:
               formfunctionpoly[0].set({{{1.0}, {-5.5}, {9.0}, {-4.5}}, {{-5.5}, {18.0}, {-13.5}}, {{9.0}, {-13.5}}, {{-4.5}}});
               formfunctionpoly[1].set({{{0.0}, {0.0}, {0.0}, {0.0}}, {{1.0}, {0.0}, {0.0}}, {{-4.5}, {0.0}}, {{4.5}}});
               formfunctionpoly[2].set({{{0.0}, {1.0}, {-4.5}, {4.5}}, {{0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[3].set({{{0.0}, {0.0}, {0.0}, {0.0}}, {{9.0}, {-22.5}, {13.5}}, {{-22.5}, {27.0}}, {{13.5}}});
               formfunctionpoly[4].set({{{0.0}, {0.0}, {0.0}, {0.0}}, {{-4.5}, {4.5}, {0.0}}, {{18.0}, {-13.5}}, {{-13.5}}});
               formfunctionpoly[5].set({{{0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {-4.5}, {0.0}}, {{0.0}, {13.5}}, {{0.0}}});
               formfunctionpoly[6].set({{{0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {-4.5}, {13.5}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[7].set({{{0.0}, {-4.5}, {18.0}, {-13.5}}, {{0.0}, {4.5}, {-13.5}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[8].set({{{0.0}, {9.0}, {-22.5}, {13.5}}, {{0.0}, {-22.5}, {27.0}}, {{0.0}, {13.5}}, {{0.0}}});
               formfunctionpoly[9].set({{{0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {27.0}, {-27.0}}, {{0.0}, {-27.0}}, {{0.0}}});
               break;
          case 4:
               formfunctionpoly[0].set({{{1.0}, {-8.3333333333333333333}, {23.333333333333333333}, {-26.666666666666666667}, {10.666666666666666667}}, {{-8.3333333333333333333}, {46.666666666666666667}, {-80.0}, {42.666666666666666667}}, {{23.333333333333333333}, {-80.0}, {64.0}}, {{-26.666666666666666667}, {42.666666666666666667}}, {{10.666666666666666667}}});
               formfunctionpoly[1].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{-1.0}, {0.0}, {0.0}, {0.0}}, {{7.3333333333333333333}, {0.0}, {0.0}}, {{-16.0}, {0.0}}, {{10.666666666666666667}}});
               formfunctionpoly[2].set({{{0.0}, {-1.0}, {7.3333333333333333333}, {-16.0}, {10.666666666666666667}}, {{0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[3].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{16.0}, {-69.333333333333333333}, {96.0}, {-42.666666666666666667}}, {{-69.333333333333333333}, {192.0}, {-128.0}}, {{96.0}, {-128.0}}, {{-42.666666666666666667}}});
               formfunctionpoly[4].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{-12.0}, {28.0}, {-16.0}, {0.0}}, {{76.0}, {-144.0}, {64.0}}, {{-128.0}, {128.0}}, {{64.0}}});
               formfunctionpoly[5].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{5.3333333333333333333}, {-5.3333333333333333333}, {0.0}, {0.0}}, {{-37.333333333333333333}, {32.0}, {0.0}}, {{74.666666666666666667}, {-42.666666666666666667}}, {{-42.666666666666666667}}});
               formfunctionpoly[6].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {5.3333333333333333333}, {0.0}, {0.0}}, {{0.0}, {-32.0}, {0.0}}, {{0.0}, {42.666666666666666667}}, {{0.0}}});
               formfunctionpoly[7].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {4.0}, {-16.0}, {0.0}}, {{0.0}, {-16.0}, {64.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[8].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {5.3333333333333333333}, {-32.0}, {42.666666666666666667}}, {{0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[9].set({{{0.0}, {5.3333333333333333333}, {-37.333333333333333333}, {74.666666666666666667}, {-42.666666666666666667}}, {{0.0}, {-5.3333333333333333333}, {32.0}, {-42.666666666666666667}}, {{0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[10].set({{{0.0}, {-12.0}, {76.0}, {-128.0}, {64.0}}, {{0.0}, {28.0}, {-144.0}, {128.0}}, {{0.0}, {-16.0}, {64.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[11].set({{{0.0}, {16.0}, {-69.333333333333333333}, {96.0}, {-42.666666666666666667}}, {{0.0}, {-69.333333333333333333}, {192.0}, {-128.0}}, {{0.0}, {96.0}, {-128.0}}, {{0.0}, {-42.666666666666666667}}, {{0.0}}});
               formfunctionpoly[12].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {96.0}, {-224.0}, {128.0}}, {{0.0}, {-224.0}, {256.0}}, {{0.0}, {128.0}}, {{0.0}}});
               formfunctionpoly[13].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {-32.0}, {32.0}, {0.0}}, {{0.0}, {160.0}, {-128.0}}, {{0.0}, {-128.0}}, {{0.0}}});
               formfunctionpoly[14].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {-32.0}, {160.0}, {-128.0}}, {{0.0}, {32.0}, {-128.0}}, {{0.0}, {0.0}}, {{0.0}}});
               break;
          case 5:
               formfunctionpoly[0].set({{{1.0}, {-11.416666666666666667}, {46.875}, {-88.541666666666666667}, {78.125}, {-26.041666666666666667}}, {{-11.416666666666666667}, {93.75}, {-265.625}, {312.5}, {-130.20833333333333333}}, {{46.875}, {-265.625}, {468.75}, {-260.41666666666666667}}, {{-88.541666666666666667}, {312.5}, {-260.41666666666666667}}, {{78.125}, {-130.20833333333333333}}, {{-26.041666666666666667}}});
               formfunctionpoly[1].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{1.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{-10.416666666666666667}, {0.0}, {0.0}, {0.0}}, {{36.458333333333333333}, {0.0}, {0.0}}, {{-52.083333333333333333}, {0.0}}, {{26.041666666666666667}}});
               formfunctionpoly[2].set({{{0.0}, {1.0}, {-10.416666666666666667}, {36.458333333333333333}, {-52.083333333333333333}, {26.041666666666666667}}, {{0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[3].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{25.0}, {-160.41666666666666667}, {369.79166666666666667}, {-364.58333333333333333}, {130.20833333333333333}}, {{-160.41666666666666667}, {739.58333333333333333}, {-1093.75}, {520.83333333333333333}}, {{369.79166666666666667}, {-1093.75}, {781.25}}, {{-364.58333333333333333}, {520.83333333333333333}}, {{130.20833333333333333}}});
               formfunctionpoly[4].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{-25.0}, {97.916666666666666667}, {-125.0}, {52.083333333333333333}, {0.0}}, {{222.91666666666666667}, {-739.58333333333333333}, {781.25}, {-260.41666666666666667}}, {{-614.58333333333333333}, {1406.25}, {-781.25}}, {{677.08333333333333333}, {-781.25}}, {{-260.41666666666666667}}});
               formfunctionpoly[5].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{16.666666666666666667}, {-37.5}, {20.833333333333333333}, {0.0}, {0.0}}, {{-162.5}, {322.91666666666666667}, {-156.25}, {0.0}}, {{510.41666666666666667}, {-781.25}, {260.41666666666666667}}, {{-625.0}, {520.83333333333333333}}, {{260.41666666666666667}}});
               formfunctionpoly[6].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{-6.25}, {6.25}, {0.0}, {0.0}, {0.0}}, {{63.541666666666666667}, {-57.291666666666666667}, {0.0}, {0.0}}, {{-213.54166666666666667}, {156.25}, {0.0}}, {{286.45833333333333333}, {-130.20833333333333333}}, {{-130.20833333333333333}}});
               formfunctionpoly[7].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {-6.25}, {0.0}, {0.0}, {0.0}}, {{0.0}, {57.291666666666666667}, {0.0}, {0.0}}, {{0.0}, {-156.25}, {0.0}}, {{0.0}, {130.20833333333333333}}, {{0.0}}});
               formfunctionpoly[8].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {-4.1666666666666666667}, {20.833333333333333333}, {0.0}, {0.0}}, {{0.0}, {31.25}, {-156.25}, {0.0}}, {{0.0}, {-52.083333333333333333}, {260.41666666666666667}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[9].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {-4.1666666666666666667}, {31.25}, {-52.083333333333333333}, {0.0}}, {{0.0}, {20.833333333333333333}, {-156.25}, {260.41666666666666667}}, {{0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[10].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {-6.25}, {57.291666666666666667}, {-156.25}, {130.20833333333333333}}, {{0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[11].set({{{0.0}, {-6.25}, {63.541666666666666667}, {-213.54166666666666667}, {286.45833333333333333}, {-130.20833333333333333}}, {{0.0}, {6.25}, {-57.291666666666666667}, {156.25}, {-130.20833333333333333}}, {{0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[12].set({{{0.0}, {16.666666666666666667}, {-162.5}, {510.41666666666666667}, {-625.0}, {260.41666666666666667}}, {{0.0}, {-37.5}, {322.91666666666666667}, {-781.25}, {520.83333333333333333}}, {{0.0}, {20.833333333333333333}, {-156.25}, {260.41666666666666667}}, {{0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[13].set({{{0.0}, {-25.0}, {222.91666666666666667}, {-614.58333333333333333}, {677.08333333333333333}, {-260.41666666666666667}}, {{0.0}, {97.916666666666666667}, {-739.58333333333333333}, {1406.25}, {-781.25}}, {{0.0}, {-125.0}, {781.25}, {-781.25}}, {{0.0}, {52.083333333333333333}, {-260.41666666666666667}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[14].set({{{0.0}, {25.0}, {-160.41666666666666667}, {369.79166666666666667}, {-364.58333333333333333}, {130.20833333333333333}}, {{0.0}, {-160.41666666666666667}, {739.58333333333333333}, {-1093.75}, {520.83333333333333333}}, {{0.0}, {369.79166666666666667}, {-1093.75}, {781.25}}, {{0.0}, {-364.58333333333333333}, {520.83333333333333333}}, {{0.0}, {130.20833333333333333}}, {{0.0}}});
               formfunctionpoly[15].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {250.0}, {-979.16666666666666667}, {1250.0}, {-520.83333333333333333}}, {{0.0}, {-979.16666666666666667}, {2500.0}, {-1562.5}}, {{0.0}, {1250.0}, {-1562.5}}, {{0.0}, {-520.83333333333333333}}, {{0.0}}});
               formfunctionpoly[16].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {41.666666666666666667}, {-41.666666666666666667}, {0.0}, {0.0}}, {{0.0}, {-354.16666666666666667}, {312.5}, {0.0}}, {{0.0}, {833.33333333333333333}, {-520.83333333333333333}}, {{0.0}, {-520.83333333333333333}}, {{0.0}}});
               formfunctionpoly[17].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {41.666666666666666667}, {-354.16666666666666667}, {833.33333333333333333}, {-520.83333333333333333}}, {{0.0}, {-41.666666666666666667}, {312.5}, {-520.83333333333333333}}, {{0.0}, {0.0}, {0.0}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[18].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {-125.0}, {281.25}, {-156.25}, {0.0}}, {{0.0}, {906.25}, {-1718.75}, {781.25}}, {{0.0}, {-1562.5}, {1562.5}}, {{0.0}, {781.25}}, {{0.0}}});
               formfunctionpoly[19].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {31.25}, {-187.5}, {156.25}, {0.0}}, {{0.0}, {-187.5}, {1093.75}, {-781.25}}, {{0.0}, {156.25}, {-781.25}}, {{0.0}, {0.0}}, {{0.0}}});
               formfunctionpoly[20].set({{{0.0}, {0.0}, {0.0}, {0.0}, {0.0}, {0.0}}, {{0.0}, {-125.0}, {906.25}, {-1562.5}, {781.25}}, {{0.0}, {281.25}, {-1718.75}, {1562.5}}, {{0.0}, {-156.25}, {781.25}}, {{0.0}, {0.0}}, {{0.0}}});
               break;
          default:
               std::cout << "Error in 'lagrangetriangle' namespace: Lagrange form functions of order 6 and above not defined" << std::endl;
               abort();
               break;
     }

     return formfunctionpoly;
}